package com.love.driver.enums;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * 司机状态枚举类
 * 定义司机的各种状态及相关操作方法
 */
public enum DriverTypeEnum {

    // 枚举实例 - 司机状态
    UNREGISTERED("1", "未注册"),
    AVAILABLE("2", "可用"),
    REST("3", "休息"),
    FROZEN("4", "冻结");

    /**
     * 状态编码
     */
    private final String code;

    /**
     * 状态描述
     */
    private final String desc;

    /**
     * 构造方法
     *
     * @param code 状态编码
     * @param desc 状态描述
     */
    DriverTypeEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    // 常用方法

    /**
     * 根据编码获取枚举实例
     *
     * @param code 状态编码
     * @return 对应的枚举实例，若未找到则返回null
     */
    public static DriverTypeEnum getByCode(String code) {
        // 空值校验
        if (code == null || code.trim().isEmpty()) {
            return null;
        }

        // 遍历枚举值匹配编码
        for (DriverTypeEnum type : values()) {
            if (type.code.equals(code)) {
                return type;
            }
        }
        return null;
    }

    /**
     * 根据编码获取描述（使用Optional避免NPE）
     *
     * @param code 状态编码
     * @return 状态描述，若未找到则返回"未知状态"
     */
    public static String getDescByCode(String code) {
        return Optional.ofNullable(getByCode(code))
                .map(DriverTypeEnum::getDesc)
                .orElse("未知状态");
    }

    /**
     * 检查编码是否有效
     *
     * @param code 状态编码
     * @return 有效返回true，否则返回false
     */
    public static boolean isValidCode(String code) {
        return getByCode(code) != null;
    }

    /**
     * 获取所有枚举的键值对映射（用于前端下拉框等场景）
     *
     * @return 包含所有状态编码和描述的Map
     */
    public static Map<String, String> toMap() {
        Map<String, String> map = new HashMap<>(values().length);
        Arrays.stream(values()).forEach(type -> map.put(type.code, type.desc));
        return map;
    }

    // Getter方法

    public String getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }
}
